//package com.zmn.plat.dubbo.impl.category;
//
//import com.alibaba.fastjson.JSON;
//import com.zmn.common.constant.GlobalConsts;
//import com.zmn.common.dictionary.GlobalDict;
//import com.zmn.common.dto.VtDTO;
//import com.zmn.common.dto2.ResponseDTO;
//import com.zmn.common.utils.collection.CollectionUtil;
//import com.zmn.common.utils.number.NumberUtil;
//import com.zmn.common.utils.reflect.BeanMapper;
//import com.zmn.gateway.dubbo.client.GUserHolder;
//import com.zmn.manager.common.database.annotation.ReadOnlyConnection;
//import com.zmn.plat.business.interfaces.category.BaseCategoryBService;
//import com.zmn.plat.common.dto.category.CategoryDIO;
//import com.zmn.plat.common.dto.category.CategoryDRO;
//import com.zmn.plat.dubbo.interfaces.category.BaseCategoryListRemoteService;
//import com.zmn.plat.dubbo.utils.DubboConsts;
//import com.zmn.plat.model.entity.category.BaseCategory;
//import com.zmn.plat.model.entity.category.BaseCategoryQuery;
//import com.zmn.plat.services.interfaces.category.BaseCategoryService;
//import com.zmn.plat.utils.bean.BeanCopyUtils;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.dubbo.config.annotation.Service;
//import org.springframework.cache.annotation.Cacheable;
//import org.springframework.cglib.beans.BeanCopier;
//import org.springframework.util.CollectionUtils;
//
//import javax.annotation.Resource;
//import javax.validation.constraints.NotEmpty;
//import javax.validation.constraints.Size;
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.List;
//import java.util.Objects;
//import java.util.stream.Collectors;
//
///**
// * @author duanzuocai
// * @version v1.0
// * @since 2018/10/19 10:42
// */
//@Slf4j
//@Service(version = DubboConsts.INTERFACE_VERSION, validation = "true")
//public class BaseCategoryListRemoteServiceImpl implements BaseCategoryListRemoteService {
//
//    private static final String TAG = "产品分类 dubbo 接口";
//
//    @Resource
//    BaseCategoryService categoryService;
//    @Resource
//    BaseCategoryBService categoryBService;
//
//    @Override
//    @ReadOnlyConnection
//    @Cacheable(key = "'dubbo:list:categ:id'+#p0", cacheNames = "redis1h")
//    public ResponseDTO<CategoryDRO> getByCategoryId(Integer categoryId) {
//        log.info("BaseCategoryListRemoteServiceImpl.getByCategoryId 参数 categoryId：{}", categoryId);
//        if (Objects.isNull(categoryId)) {
//            log.error("{}参数:{}不能为空", TAG, "categoryId");
//            return ResponseDTO.fail("categoryId不能为空");
//        }
//
//        BaseCategory category = categoryService.findByKey(categoryId);
//
//        if (Objects.isNull(category)) {
//            log.error("{}参数:{}对应的Area对象不存在", TAG, "categoryId");
//            return ResponseDTO.fail(String.format("[%s]对应的category对象不存在", categoryId));
//        }
//
//        CategoryDRO categoryDRO = new CategoryDRO();
//        try {
//            BeanCopyUtils.copyProperties(category, categoryDRO);
//        } catch (Exception ex) {
//            log.error("{}对象:{}拷贝出错,ex", TAG, "CopyObjectUtil<BaseCategory, CategoryDRO>", ex);
//            return ResponseDTO.fail("拷贝category对象出错");
//        }
//
//        return ResponseDTO.success(categoryDRO, GlobalConsts.SUCCESS_MSG);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    @Cacheable(key = "'dubbo:list:categ:ids'+#p0", cacheNames = "redis1h")
//    public ResponseDTO<List<CategoryDRO>> getByCategoryIds(List<Integer> categIdList) {
//        log.info("BaseCategoryListRemoteServiceImpl.getByCategoryId 参数 categoryId：{}", JSON.toJSONString(categIdList));
//        if (CollectionUtil.isNullOrEmpty(categIdList)) {
//            log.error("{}参数:{}不能为空", TAG, "categoryId");
//            return ResponseDTO.fail("categoryId不能为空");
//        }
//        BaseCategoryQuery query = new BaseCategoryQuery();
//        query.setCategIds(categIdList);
//        List<BaseCategory> list = categoryService.listByQuery(query);
//
//        if (CollectionUtil.isNullOrEmpty(list)) {
//            log.error("{}参数:{}对应的Area对象不存在", TAG, "categoryId");
//            return ResponseDTO.fail(String.format("[%s]对应的category对象不存在"));
//        }
//
//        try {
//            List<CategoryDRO> categoryDROList = BeanMapper.mapList(list, CategoryDRO.class);
//            return ResponseDTO.success(categoryDROList, GlobalConsts.SUCCESS_MSG);
//        } catch (Exception ex) {
//            log.error("{}对象:{}拷贝出错,ex", TAG, "CopyObjectUtil<BaseCategory, CategoryDRO>", ex);
//            return ResponseDTO.fail("拷贝category对象出错");
//        }
//    }
//
//    @Override
//    @ReadOnlyConnection
//    @Cacheable(key = "'dubbo:list:categs:pid'+#p0", cacheNames = "redis1h")
//    public ResponseDTO<List<VtDTO>> listByParentId(Integer parentId) {
//        log.info("BaseCategoryListRemoteServiceImpl.listByParentId入参parentId：{}", parentId);
//
//        if (Objects.isNull(parentId)) {
//            log.error("{}参数:{}不能为空", TAG, "parentId");
//            return ResponseDTO.fail("parentId不能为空");
//        }
//
//        List<VtDTO> items = categoryService.listByParentId(parentId);
//
//        return ResponseDTO.success(items, GlobalConsts.SUCCESS_MSG);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    public ResponseDTO<List<VtDTO>>
//    listVtByParentIds(@NotEmpty(message = "parentIdList参数不能为空且个数不能超过" + DubboConsts.MAX_PARAM_LENGTH) @Size(min = 1,
//            max = DubboConsts.MAX_PARAM_LENGTH, message = "names参数不能为空且个数不能超过" + DubboConsts.MAX_PARAM_LENGTH) List<Integer> parentIdList) {
//        log.info("BaseCategoryListRemoteServiceImpl.listVtByParentIds参数parentIdList：{}", parentIdList);
//
//        BaseCategoryQuery query = new BaseCategoryQuery();
//        query.setParentIds(parentIdList);
//        List<BaseCategory> baseCategoryList = categoryService.listByQuery(query);
//
//        if (CollectionUtils.isEmpty(baseCategoryList)) {
//            return ResponseDTO.fail("当前分类下没有对应子分类数据");
//        }
//
//        List<VtDTO> dtos =
//                baseCategoryList.stream().map(e -> new VtDTO(e.getCategId(), e.getName(), e.getStatus())).collect(Collectors.toList());
//        return ResponseDTO.success(dtos);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    public ResponseDTO<CategoryDRO> getShowCategoryByCategId(Integer categId) {
//        log.info("BaseCategoryRemoteServiceImpl.getShowCategoryByCategId 参数为：{}", categId);
//        if (Objects.isNull(categId)) {
//            return ResponseDTO.fail("categId不能为空");
//        }
//        CategoryDRO dro = categoryBService.findShowCategoryByCategId(categId);
//        if (Objects.isNull(dro)) {
//            return ResponseDTO.fail("数据不存在");
//        }
//        return ResponseDTO.success(dro);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    public ResponseDTO<List<CategoryDRO>> listByCategIdListAndStatus(List<Integer> categIdList, Integer status) {
//        log.info("BaseCategoryListRemoteServiceImpl.listByCategIdListAndStatus 参数 categIdList：{},status:{}", categIdList, status);
//        if (CollectionUtils.isEmpty(categIdList)) {
//            return ResponseDTO.fail("categIdList不能为空");
//        }
//        BaseCategoryQuery categoryQuery = new BaseCategoryQuery();
//        categoryQuery.setCategIds(categIdList);
//        if (NumberUtil.isPositiveInteger(status)) {
//            categoryQuery.setStatus(status);
//        }
//        List<BaseCategory> categs = categoryService.listByQuery(categoryQuery);
//
//        List<CategoryDRO> list = BeanCopyUtils.copyProperties(categs, BaseCategory.class, CategoryDRO.class, CategoryDRO::new);
//        return ResponseDTO.success(list);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    public ResponseDTO<List<CategoryDRO>> listByQuery(CategoryDIO query) {
//        log.info("BaseCategoryListRemoteServiceImpl.listByQuery 参数 query：{}", query);
//        if (Objects.isNull(query)) {
//            log.error("{}参数:{}不能为空", TAG, "query");
//            return ResponseDTO.fail("query不能为空");
//        }
//
//        BaseCategoryQuery categoryQuery = new BaseCategoryQuery();
//        try {
//            BeanCopyUtils.copyProperties(query, categoryQuery);
//        } catch (Exception ex) {
//            log.error("{}对象:{}拷贝出错", TAG, "CopyObjectUtil<BaseCategory, CategoryDRO>", ex);
//            return ResponseDTO.fail("拷贝category对象出错");
//        }
//
//        List<BaseCategory> categs = categoryService.listByQuery(categoryQuery);
//
//        List<CategoryDRO> items = new ArrayList<>();
//        try {
//            BeanCopier copierDro = BeanCopier.create(BaseCategory.class, CategoryDRO.class, false);
//            for (BaseCategory categ : categs) {
//                CategoryDRO dro = new CategoryDRO();
//                copierDro.copy(categ, dro, null);
//                items.add(dro);
//            }
//        } catch (Exception ex) {
//            log.error("{}对象:{}拷贝出错", TAG, "CopyObjectUtil<BaseCategory, CategoryDRO>", ex);
//            return ResponseDTO.fail(String.format("拷贝category对象出错"));
//        }
//
//        return ResponseDTO.success(items, GlobalConsts.SUCCESS_MSG);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    @Cacheable(key = "'dubbo:list:ec_category:parent:' + #p0", cacheNames = "redis5m")
//    public ResponseDTO<List> listEcCategoryVtByParentId(Integer parentId) {
//        return listEcCategoryVtByParentId(parentId, false);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    @Cacheable(key = "'dubbo:list:ec_category:parent:' + #p0 + ':limit:' + #p1", cacheNames = "redis5m")
//    public ResponseDTO<List> listEcCategoryVtByParentId(Integer parentId, Boolean limitPermit) {
//        log.info("BaseCategoryListRemoteServiceImpl.listEcCategoryVtByParentId 参数parentId：{}，limitPermit：{}", parentId, limitPermit);
//        Integer staffId = null;
//        if (limitPermit) {
//            staffId = GUserHolder.getCurrentLoginStaffId();
//            if (NumberUtil.isNullOrZero(staffId)) {
//                staffId = -1;
//            }
//        }
//        return listEcCategoryVtByParentId(parentId, staffId);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    @Cacheable(key = "'dubbo:list:ec_category:staff:' + #p1 + ':parent:' + #p0", cacheNames = "redis5m")
//    public ResponseDTO<List> listEcCategoryVtByParentId(Integer parentId, Integer staffId) {
//        return listCategoryVtByParentId(parentId, staffId, 2);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    @Cacheable(key = "'dubbo:list:erp_category:parent:' + #p0", cacheNames = "redis5m")
//    public ResponseDTO<List> listErpCategoryVtByParentId(Integer parentId) {
//        return listErpCategoryVtByParentId(parentId, false);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    @Cacheable(key = "'dubbo:list:erp_category:parent:' + #p0 + ':limit:' + #p1", cacheNames = "redis5m")
//    public ResponseDTO<List> listErpCategoryVtByParentId(Integer parentId, Boolean limitPermit) {
//        Integer staffId = null;
//        if (limitPermit) {
//            staffId = GUserHolder.getCurrentLoginStaffId();
//            if (NumberUtil.isNullOrZero(staffId)) {
//                staffId = -1;
//            }
//        }
//        return listErpCategoryVtByParentId(parentId, staffId);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    @Cacheable(key = "'dubbo:list:erp_category:staff:' + #p1 + ':parent:' + #p0", cacheNames = "redis5m")
//    public ResponseDTO<List> listErpCategoryVtByParentId(Integer parentId, Integer staffId) {
//        return listCategoryVtByParentId(parentId, staffId, 1);
//    }
//
//    @Override
//    @ReadOnlyConnection
//    public ResponseDTO<Integer> countByQuery(CategoryDIO query) {
//        log.info("BaseCategoryListRemoteServiceImpl.countByQuery 参数 query：{}", query);
//        if (Objects.isNull(query)) {
//            log.error("{}参数:{}不能为空", TAG, "query");
//            return ResponseDTO.fail("query不能为空");
//        }
//
//        BaseCategoryQuery categoryQuery = new BaseCategoryQuery();
//        try {
//            BeanCopyUtils.copyProperties(query, categoryQuery);
//        } catch (Exception ex) {
//            log.error("{}对象:{}拷贝出错", TAG, "CopyObjectUtil<BaseCategory, CategoryDRO>", ex);
//            return ResponseDTO.fail("拷贝category对象出错");
//        }
//
//        int count = categoryService.countByQuery(categoryQuery);
//        return ResponseDTO.success(count, GlobalConsts.SUCCESS_MSG);
//    }
//
//    /**
//     * 根据父Id取得所有子分类列表
//     *
//     * @param parentId 父分类ID
//     * @param staffId  员工Id，为空或0则不过滤数据权限
//     * @param showType 产品分类类型，1ERP分类，2前台分类
//     * @return
//     */
//    private ResponseDTO<List> listCategoryVtByParentId(Integer parentId, Integer staffId, Integer showType) {
//
//        // -1表示要求数据权限但未通过身份校验
//        if (NumberUtil.isNotNullOrZero(staffId) && staffId == -1) {
//            return ResponseDTO.fail("身份校验失败");
//        }
//
//        // 参数校验
//        if (NumberUtil.isNullOrZero(parentId)) {
//            return ResponseDTO.fail("parentId参数错误");
//        }
//
//        // 取得下级区域列表
//        BaseCategoryQuery query = new BaseCategoryQuery();
//        query.setShowType(showType);
//        query.setParentId(parentId);
//        query.setStatus(GlobalDict.STATUS_ENABLE);
//        List<BaseCategory> categories = categoryService.listByQuery(query);
//
//        if (CollectionUtil.isNullOrEmpty(categories)) {
//            return ResponseDTO.success(Collections.EMPTY_LIST);
//        }
//
//        List<VtDTO> items = categories.stream().map(item -> {
//            return new VtDTO(item.getCategId(), item.getName(), item.getStatus());
//        }).collect(Collectors.toList());
//
//        // 忽略数据权限过滤
//        if (NumberUtil.isNullOrZero(staffId)) {
//            return ResponseDTO.success(items);
//        }
//
//        // 过滤数据权限(只过滤1级产品分类)
//        // if(parentId == GlobalConsts.TOP_ID) {
//        // PermitDTO<VtDTO> permit = permitDataRemoteService.checkPermitDataVts(items, PermitDataConsts.PERMIT_DATA_CATEG, staffId);
//        // return com.zmn.common.dto2.ResponseDTO.success(permit.getItems());
//        // } else {
//        // return com.zmn.common.dto2.ResponseDTO.success(items);
//        // }
//
//        return ResponseDTO.success(items);
//    }
//
//}
